package utils

import (
	"context"
	"github.com/gogf/gf/v2/frame/g"
	"sync"
	"time"
)

// 定义全局变量和互斥锁
var (
	userStore = make(map[string]UserAgentExpiry)
	userLock  = sync.RWMutex{}
)

// 封装存储到Map的Token过期时间
type UserAgentExpiry struct {
	UserInfo UserAgents
	Expiry   time.Time
}

// 设置用户信息和超时时间
func SetUserInfo(token string, userInfo UserAgents, duration time.Duration) {
	userLock.Lock()
	userStore[token] = UserAgentExpiry{
		UserInfo: userInfo,
		Expiry:   time.Now().Add(duration),
	}
	userLock.Unlock()
}

// 获取用户信息，如果信息已经过期，则返回零值
func GetUserInfo(token string) (UserAgents, bool) {
	userLock.RLock()
	userExpiry, exists := userStore[token]
	userLock.RUnlock()

	if !exists || time.Now().After(userExpiry.Expiry) {
		return UserAgents{}, false
	}
	return userExpiry.UserInfo, true
}

// 用户验证成功，查询用户详情
type UserAgents struct {
	ID        int       `json:"id" dc:"主键"`
	Username  string    `json:"username" dc:"用户名"`
	Name      string    `json:"name" dc:"姓名"`
	Phone     string    `json:"phone" dc:"手机号"`
	Status    string    `json:"status" dc:"状态 1正常 -1禁用"`
	AgentID   int       `json:"agentid" dc:"代理商ID"`
	AgentName string    `json:"agentName" dc:"代理商名称"`
	CreatedAt time.Time `json:"createdAt" dc:"创建时间"`
	UpdatedAt time.Time `json:"updatedAt" dc:"更新时间"`
}

// 清理过期的数据【设置为24小时过期】
func CleanupExpiredUserInfos() {
	for {
		time.Sleep(24 * time.Hour) // 每24小时清理一次
		userLock.Lock()
		for token, userExpiry := range userStore {
			if time.Now().After(userExpiry.Expiry) {
				delete(userStore, token)
			}
		}
		g.Dump("清理Map中的Token数据")
		userLock.Unlock()
	}
}

// 获取当前登录用户
func CurrentUserInfo(ctx context.Context) (userInfo UserAgents, valid bool) {
	request := g.RequestFromCtx(ctx)
	token := request.Header.Get("Authorization")

	if token == "" {
		return UserAgents{}, false // 未提供令牌
	}

	userInfo, valid = GetUserInfo(token)
	if !valid {
		return UserAgents{}, false // 用户信息无效或已过期
	}

	return userInfo, true // 返回有效的用户信息
}
